/**
 * 
 */
package br.com.livraria.tags;

import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.TagSupport;

/**
 * @author Jeferson
 *
 */
public class DataTableTag extends TagSupport {

	private static final long serialVersionUID = -8260096859220532598L;

	
	private String classe;
	private String lista;
	private String[] listaNomeColunas;
	private String[] attrDados;
	
	
	
	@Override
	public int doStartTag() throws JspException {
		JspWriter out = pageContext.getOut();
        HttpServletRequest request = (HttpServletRequest)pageContext.getRequest();
        
        
        try {
			
        	Class<?> tipoClasse = Class.forName(classe);
			
			List listaDados = (List)request.getAttribute(lista);
			
			
			StringBuilder html = new StringBuilder();
			
			html.append("<table id=\"idDataTable\">\n")
			.append("<tr>\n");
			for (int i = 0; i < listaNomeColunas.length; i++) {
				html.append("<th>").append(listaNomeColunas[i]).append("</th>\n");
			}
			html.append("</tr>\n");
			
			int i = 0;
			String classStyle = "par";
			
			for (Object obj : listaDados) {
				
				i++;
				
				if(i%2==0)
					classStyle = "par";
				else 
					classStyle = "impar";
				
				html.append("<tr ").append("class=\"").append(classStyle).append("\">\n");
				
				Class clazz = tipoClasse.cast(obj).getClass(); 
				
				Method[] metodos = clazz.getMethods();
				
				for (String nomeAtributo : attrDados) {
					html.append("<td>");
					
					for (Method m : metodos) {
						if(m.getName().equals("get"+primeiraMaiuscula(nomeAtributo))){
							Object valor = m.invoke(obj);
							
							html.append(valor);
							
							break;
						}
					}
					html.append("</td>\n");
				}
				html.append("</tr>\n");
			}
			
			html.append("</table>\n");
			
        	out.write(html.toString());
        	
        } catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return super.doStartTag();
	}
	
	

	public String getClasse() {
		return classe;
	}

	public void setClasse(String classe) {
		this.classe = classe;
	}

	
	public String[] getListaNomeColunas() {
		return listaNomeColunas;
	}

	public void setListaNomeColunas(String[] listaNomeColunas) {
		this.listaNomeColunas = listaNomeColunas;
	}

	public String[] getAttrDados() {
		return attrDados;
	}

	public void setAttrDados(String[] attrDados) {
		this.attrDados = attrDados;
	}
	
	
	
	
	
	public String getLista() {
		return lista;
	}



	public void setLista(String lista) {
		this.lista = lista;
	}



	private String primeiraMaiuscula(String str){
		
		String strTratada = "";
		
		String primeiraLetra = str.charAt(0)+"";
		
		strTratada = primeiraLetra.toUpperCase() + str.substring(1);
		
		return strTratada;
	}
	
}
